import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'

// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    // 购物车商品列表
    list: []
  }),
  getters: {
    // 1. 计算有效商品列表=》`isEffective = true`
    // 2. 计算有效商品的总数量
    // 3. 计算有效商品的总价
    // 有效商品列表
    effectiveList: state => {
      return state.list.filter(item => item.isEffective)
    },
    effectiveListCounts: (state, getters) => {
      return getters.effectiveList.reduce((acc, item) => acc + item.count, 0)
    },
    effectiveListTotal: (state, getters) => {
      return getters.effectiveList.reduce((acc, item) => acc + item.count * item.nowPrice, 0)
    },
    // 1. 选中的购物车商品数据
    // 2. 选中商品总价
    // 3. 购物车中商品是否时全部选中状态
    selectedEffectiveList: (state, getters) => {
      return getters.effectiveList.filter(item => item.selected)
    },
    selectedEffectiveListTotal: (state, getters) => {
      return getters.selectedEffectiveList.reduce((acc, item) => acc + item.count * item.nowPrice, 0)
    },
    // 是否全选
    isAll (state, getters) {
      return getters.effectiveList.every((item) => item.selected)
    }
  },
  mutations: {
    // 加入购物车
    /**
     *
     * @param {*} state
     * @param {*} good 当前加入购物车商品{}
     */
    addCart (state, good) {
      /**
       * 思路：
       * 1. 判断当前good商品之前如果加过=》增加数量
       * 2. 判断当前good商品之前如果没加过=》新增
       */
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      if (index > -1) {
        state.list[index].count += good.count
      } else {
        state.list.unshift(good)
      }
    },
    // 删除购物车商品
    delCart (state, good) {
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    // 商品选中（单选）
    singleCheck (state, { good, selected }) {
      /**
       * 1. 找到当前单选的商品
       * 2. 通过state修改
       */
      const currProd = state.list.find(item => item.skuId === good.skuId)
      currProd.selected = selected
    },
    // 商品全选/取消
    checkAll (state, selected) {
      state.list.forEach((item) => {
        item.selected = selected
      })
    },
    // 商品数量修改
    changCount (state, { good, count }) {
      const currProd = state.list.find(item => item.skuId === good.skuId)
      // 注意：不能累加=》count就是当前商品最新的数量
      currProd.count = count
    },
    // 修改list购物车数据
    setList (state, newList) {
      state.list = newList
    }
  },
  actions: {
    // 合并购物车商品=》当前登录人购物车商品 = 之前服务器存储的购物车商品 + 之前本地存储的购物车商品
    async mergeCartAction ({ state, dispatch }) {
      /**
      * 1. 判断本地是否存储的有购物车商品
      * 2. 如果有，就调用接口合并
      * 3. 合并完，重新获取当前登录人的购物车商品数据
      */
      if (state.list.length) {
        const mergeData = state.list.map(item => {
          return { skuId: item.skuId, selected: item.selected, count: item.count }
        })
        await mergeLocalCart(mergeData)
      }
      // 合并完，重新获取当前登录人的购物车商品数据(随后测试)
      dispatch('getCartList')
    },
    // 获取当前登录人购物车商品数据(最新)
    async getCartList ({ commit }) {
      const { result } = await findCartList()
      // 存储
      commit('setList', result)
    },
    // 加入购物车action
    /**
     *
     * @param {*} param0 rootState 获取store所有数据
     * @param {*} good 当前加入购物车商品{}
     */
    // Promise封装基本写法
    // addCartAction ({ commit, rootState }, good) {
    //   return new Promise((resolve, reject) => {
    //     if (rootState.user.profile.token) {
    //       // 登录后加入购物车=>随后实现
    //       console.log('登录后加入购物车=>随后实现')
    //     } else {
    //       console.log('未登录加入购物车')
    //       // 未登录加入购物车
    //       commit('addCart', good)
    //       // 使用resolve()告诉外边加入购物车成功
    //       resolve('加入成功了')
    //     }
    //   })
    // }
    // Promise封装异步函数写法
    /**
     * 1. resolve()使用return 值
     * 2. reject() 使用 throw new Error(值)
     */
    async addCartAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // 登录后加入购物车=>随后实现
        console.log('登录后加入购物车=>随后实现')
        /**
         * 1. 调用接口入库
         * 2. 调用接口获取最新的
         */
        await insertCart({ skuId: good.skuId, count: good.count })
        dispatch('getCartList')
      } else {
        console.log('未登录加入购物车')
        // 未登录加入购物车
        commit('addCart', good)
        // return '未登录加入购物车'// 相当于resolve(data)
        // 使用resolve()告诉外边加入购物车成功
      }
    },
    async delCartAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // 登录后加入购物车=>随后实现
        await deleteCart([good.skuId])
        dispatch('getCartList')
      } else {
        // 未登录加入购物车
        commit('delCart', good)
      }
    },
    async singleCheckAction ({ commit, dispatch, rootState }, { good, selected }) {
      if (rootState.user.profile.token) {
        // 登录后加入购物车=>随后实现
        await updateCart({ ...good, selected })
        dispatch('getCartList')
      } else {
        // 未登录加入购物车
        commit('singleCheck', { good, selected })
      }
    },
    async checkAllAction ({ commit, state, dispatch, rootState }, selected) {
      if (rootState.user.profile.token) {
        // 登录后加入购物车=>随后实现
        const ids = state.list.map(item => item.skuId)
        await checkAllCart({ selected, ids })
        dispatch('getCartList')
      } else {
        // 未登录加入购物车
        commit('checkAll', selected)
      }
    },
    async changCountAction ({ commit, dispatch, rootState }, { good, count }) {
      if (rootState.user.profile.token) {
        // 登录后加入购物车=>随后实现
        await updateCart({ ...good, count })
        dispatch('getCartList')
      } else {
        // 未登录加入购物车
        commit('changCount', { good, count })
      }
    }
  }
}
